home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / getline.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  2KB  |  121 lines

  1.  
  2. /*
  3.  * @(#)getline.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. /*
  8.  * getline.c:  read input line for Sun ROM Monitor.
  9.  */
  10.  
  11. #include "../sun3/sunmon.h"
  12. #include "../h/globram.h"
  13.  
  14. /*
  15.  * read the next input line into a global buffer
  16.  */
  17. getline(echop)
  18.     int echop;
  19. {
  20.     register unsigned char *p = gp->g_linebuf;
  21.     register int linelength = 0;
  22.     register int erase;    /* number of characters to erase */
  23.  
  24.     gp->g_lineptr = p;    /* reset place-in-line pointer */
  25.     gp->g_tracecmds= 0;    /* Reset trace ptr, which shares buf w/us */
  26.  
  27.     for (;;) {
  28.         while ( (erase=mayget()) <= 0) ;  /* Skip nulls too */
  29.  
  30.         *p = (unsigned char) erase;
  31.  
  32.         if (*p == CERASE1 || *p == CERASE2)
  33.             erase = 1;    /* erase one character */
  34.         else if (*p == CKILL1)
  35.             erase = linelength;    /* erase all chars on line */
  36.         else {
  37.             if (echop) 
  38.                 putchar (erase);
  39.  
  40.             if (*p == '\r') 
  41.                 break;
  42.  
  43.             if (linelength < BUFSIZE) { /* line not full */
  44.                 p++;
  45.                 linelength++;
  46.             /* here we could ding for line-too-long */
  47.             }
  48.             erase = 0;
  49.         }
  50.  
  51.         while(linelength && erase--) {
  52.             p--;
  53.             linelength--;
  54.             printf("\b \b");
  55.             }
  56.     }
  57.  
  58.     if (echop) 
  59.         putchar('\n'); /* echo a linefeed to follow the return */
  60.     *(++p)= '\0';         /* the ++ protects the \r to make getone() work */
  61.     gp->g_linesize = linelength;
  62. }
  63.  
  64. /*
  65.  * gets one character from the input buffer; returns are
  66.  * converted to nulls
  67.  */
  68. unsigned char
  69. getone()
  70. {
  71.  
  72.     return ((*(gp->g_lineptr)=='\r')? '\0': *((gp->g_lineptr)++));
  73. }
  74.  
  75. /*
  76.  * indicates the next character that getone() would return;
  77.  * does NOT convert \r to \0.
  78.  */
  79. unsigned char
  80. peekchar()
  81. {
  82.  
  83.     return(*(gp->g_lineptr));
  84. }
  85.  
  86. /* get a hex number */
  87. int
  88. getnum()
  89. {
  90.         register int v = 0;
  91.         register int hexval;
  92.  
  93.         while ((hexval= ishex(peekchar()))>=0) {
  94.                         v= (v<<4)| hexval;
  95.                         getone();
  96.         }
  97.         return(v);
  98. }
  99. /*
  100.  * Skips blanks on a command line 
  101.  */
  102. skipblanks()
  103. {
  104.     while (peekchar() == ' ')
  105.         getone();
  106. }
  107.  
  108. /*
  109.  * Returns the hex value of a char or -1 if the char is not hex
  110.  */
  111. int
  112. ishex(c)
  113.         register unsigned char c;
  114. {
  115.  
  116.         if ((c>='0')&&(c<='9')) return(c-'0');
  117.         if (c>='a'&&c<='f')     return(c-'a'+10);
  118.         if (c>='A'&&c<='F')     return(c-'A'+10);
  119.         return(-1);
  120. }
  121.